﻿// ***********************************************************************************************************************************************************
// * Copyright (c) 2008 Unit Software                                                                                                                        *
// *                                                                                                                                                         *
// * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),      *
// * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,      *
// * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:              *
// *                                                                                                                                                         *
// * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.                          *
// *                                                                                                                                                         *
// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,     *
// * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      *
// * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS    *
// * IN THE SOFTWARE.                                                                                                                                        *
// ***********************************************************************************************************************************************************

using System;
using System.Data.Linq;
using NUnit.Framework;
using UnitSoftware.LINQ2SQLExtensions;

namespace LINQ2SQLExtentionsUnitTestSuite
{
    [TestFixture]
    public class ConcurrencyTests
    {
        [Test]
        public void SimpleCustomResolution()
        {
            var context = DataContextFactory.INSTANCE.GetNewDataContext();

            context.ClearAllData();

            var invoice = new Invoice { Raised = DateTime.Now };

            context.Invoices.InsertOnSubmit(invoice);

            //Create invoice
            context.SubmitChanges();

            //Load invoice on 2nd context
            var context2 = DataContextFactory.INSTANCE.GetNewDataContext();

            var invoice2 = (Invoice)invoice.GetOnContext(context2);

            //Change invoice on 1st context
            invoice.Description = "Test";

            context.SubmitChanges();

            Assert.AreEqual(null, invoice2.Description);

            //Change invoice on 2nd context
            invoice2.Description = "Test2";

            DataChanges dataChanges;   

            //Confirm conflict
            Assert.AreEqual(1, (dataChanges = context2.SubmitChanges()).Conflicts.Count);

            var objectChangeConflict = dataChanges.Conflicts[0];

            Assert.AreEqual(1, objectChangeConflict.MemberConflicts.Count);

            var memberChangeConflict = objectChangeConflict.MemberConflicts[0];

            Assert.AreEqual(null, memberChangeConflict.OriginalValue);
            Assert.AreEqual("Test", memberChangeConflict.DatabaseValue);
            Assert.AreEqual("Test2", memberChangeConflict.CurrentValue);

            //Resolve conflict..
            memberChangeConflict.Resolve(RefreshMode.KeepChanges);

            //..and submit
            context2.SubmitChanges();
        }

        [Test]
        public void SimpleDefaultResolution()
        {
            var context = DataContextFactory.INSTANCE.GetNewDataContext();

            context.ClearAllData();

            var invoice = new Invoice { Raised = DateTime.Now };

            context.Invoices.InsertOnSubmit(invoice);

            //Create invoice
            context.SubmitChanges();

            //Load invoice on 2nd context
            var context2 = DataContextFactory.INSTANCE.GetNewDataContext();

            var invoice2 = (Invoice)invoice.GetOnContext(context2);

            //Change invoice on 1st context
            invoice.Description = "Test";

            context.SubmitChanges();

            Assert.AreEqual(null, invoice2.Description);

            //Change invoice on 2nd context
            invoice2.Description = "Test2";

            var dataChanges = context2.SubmitChangesAndResolveConflicts(RefreshMode.KeepChanges);

            Assert.AreEqual(0, dataChanges.Conflicts.Count);
            Assert.AreEqual(0, dataChanges.Inserts.Count);
            Assert.AreEqual(0, dataChanges.Deletes.Count);
            Assert.AreEqual(1, dataChanges.Updates.Count);
            Assert.AreEqual("Test2", invoice2.Description);
        }

    }
}
